import 'package:get/get.dart';
import 'package:photo_manager/photo_manager.dart';

import '/app/pages/home/home_controller.dart';
import '/app/utils/local_storage_utils.dart';
import '../utils/local_file_utils.dart';

// 管理播放历史的类
class HistoryManager {
  // 存储播放历史的键
  static const String _key = "play_history";

  // 存储播放时间记录的键前缀
  static const String _play_time_key = "play_history_time";

  /// 添加播放时间记录
  static Future<void> addPlayHistoryTime(String videoId, String lastPlayTime) async {
    String videoTimeKey = _play_time_key + videoId;
    await LocalStorageUtils.saveString(videoTimeKey, lastPlayTime);
    print("HistoryManager#addPlayHistoryTime 添加播放时间记录成功 $videoId, $lastPlayTime");
  }

  /// 获取播放时间记录
  static Future<String> getPlayHistoryTime(String videoId) async {
    String videoTimeKey = _play_time_key + videoId;
    String? time = await LocalStorageUtils.getString(videoTimeKey);
    return time ?? ""; // 如果不存在则返回空字符串
  }

  /// 删除播放时间记录
  static Future<void> removePlayHistoryTime(String videoId) async {
    String videoTimeKey = _play_time_key + videoId;
    await LocalStorageUtils.remove(videoTimeKey);
    print("HistoryManager#removePlayHistoryTime 删除播放时间记录成功 $videoId");
  }

  /// 添加播放记录
  /// 1. 检查历史记录是否存在
  /// 2. 如果存在，将记录移到列表末尾
  /// 3. 存储最新的历史记录
  /// 添加播放记录
  /// 1. 检查历史记录是否存在
  /// 2. 如果存在，将记录移到列表末尾
  /// 3. 存储最新的历史记录
  static Future<void> addPlayHistory(String videoId, String lastPlayTime) async {
    List<String>? historyIds = await LocalStorageUtils.getStringList(_key);

    // 如果历史记录为空，初始化为空列表
    historyIds ??= [];

    print("HistoryManager#addPlayHistory 添加历史记录 $videoId, $lastPlayTime");

    // 确保列表中没有重复的 videoId
    if (!historyIds.contains(videoId)) {
      // 将视频ID添加到列表末尾
      historyIds.add(videoId);
    } else {
      // 如果已经存在，先移除，再添加到末尾
      historyIds.remove(videoId);
      historyIds.add(videoId);
    }

    // 保存更新后的历史记录
    await LocalStorageUtils.saveStringList(_key, historyIds);
    print("HistoryManager#addPlayHistory 历史数据存储成功 $videoId");

    // 保存播放时间
    await addPlayHistoryTime(videoId, lastPlayTime);
    print("HistoryManager#addPlayHistory 保存播放时间成功 $videoId, $lastPlayTime");

    // 更新历史记录数据
    final HomeController homeController = Get.find();
    await homeController.loadHistoryVideos(); // 添加历史记录后重新加载数据
    print("HistoryManager#addPlayHistory 添加历史成功 $videoId, $lastPlayTime");

    // 新db 添加历史记录 先注释掉
    // final AppVideoController appController = Get.put(AppVideoController());
    // print("HistoryManager#addPlayHistory 获取 AppController $videoId, $lastPlayTime");
    // await appController.addPlayHistory(videoId, lastPlayTime);
    // print("HistoryManager#addPlayHistory 添加历史成功2 $videoId, $lastPlayTime");
  }

  /// 删除指定视频的播放记录
  static Future<void> removePlayHistory(String videoId) async {
    List<String>? historyIds = await LocalStorageUtils.getStringList(_key);
    if (historyIds != null && historyIds.contains(videoId)) {
      // 如果历史记录中包含视频ID，移除它
      historyIds.remove(videoId);
      await LocalStorageUtils.saveStringList(_key, historyIds);
      print("HistoryManager#removePlayHistory 删除播放记录 $videoId");
    }
  }

  /// 获取所有历史播放记录的视频
  static Future<List<AssetEntity>> getHistoryVideos() async {
    List<String>? videoIds = await LocalStorageUtils.getStringList(_key);

    print("HistoryManager#getHistoryVideos 开始查询");

    if (videoIds == null || videoIds.isEmpty) {
      print("HistoryManager#getHistoryVideos 查询数据为空");
      return [];
    }

    print("HistoryManager#getHistoryVideos 查询历史记录数据 ${videoIds.length}");

    // 根据视频ID获取 AssetEntity
    List<AssetEntity> videos = await LocalFileUtils.getAssetsByIds(videoIds);

    // 倒叙，最新的数据在前面
    List<AssetEntity> reversedVideos = videos.reversed.toList();
    return reversedVideos;
  }

  /// 清除所有播放历史
  static Future<void> clearAll() async {
    // 获取历史记录中的视频ID列表
    List<String>? videoIds = await LocalStorageUtils.getStringList(_key);

    if (videoIds == null || videoIds.isEmpty) {
      print("HistoryManager#clearAll 查询数据为空，无需清理");
      // 如果历史记录为空，直接清理存储中的历史记录键
      await LocalStorageUtils.remove(_key);
      return;
    }

    print("HistoryManager#clearAll 查询历史记录数据 ${videoIds.length}");

    // 遍历视频ID，删除每个视频的播放时间记录
    for (String videoId in videoIds) {
      await removePlayHistoryTime(videoId);
    }

    // 删除历史记录列表
    await LocalStorageUtils.remove(_key);
    print("HistoryManager#clearAll 成功清除所有历史记录");

    final HomeController homeController = Get.find();
    await homeController.loadHistoryVideos(); // 添加历史记录后重新加载数据
  }
}
